#ifndef CONTROLADORCENTRAL_H_
#define CONTROLADORCENTRAL_H_

#include <string>
#include <list>
#include "../lib/Cola.h"
#include "../lib/Constantes.h"
#include "../lib/TiposDatos.h"
#include "../lib/ManejadorSemAscensores.h"
#include "../lib/MonitorAscensores.h"
#include "../lib/MonitorPisos.h"
#include "../lib/SIGUSR1_Handler.h"
#include "../lib/Logger.h"

class ControladorCentral {

private:
	registroAscensor listaAscensores[MAXASCENSORES];
	MonitorAscensores* monitorAscensores;
	MonitorPisos* monitorPisos;
	ManejadorSemAscensores* manejador;
	Cola<mensaje>* cola;
	int cantidadAscensores;
	int ascensoresRegistrados;
	int cantidadPisos;
	int personasEnPisos;
	mensaje peticionRecibida;
	// event handler para la senial SIGUSR1 (-19)
	SIGUSR1_Handler sigusr1_handler;
	Logger* logger;

	void inicializarListaAscensores();

	void registrarAscensor(tascensor ascensor);

	void eliminarAscensor(tascensor ascensor);

	char obtenerDireccionAscensor(int pisoActual, int vec_pos[]);

	bool buscarPisoSuperior(tascensor* pAscensor);

	bool buscarBajandoDesdeTop(tascensor* pAscensor);

	bool buscarPisoInferior(tascensor* pAscensor);

	bool buscarSubiendoDesdeBase(tascensor* pAscensor);

	void subiendoParadaMasProxima(tascensor* pAscensor, int vec_pos[]);

	void bajandoParadaMasProxima(tascensor* pAscensor, int vec_pos[]);

	void encontrarDestino(tascensor* pAscensor);

	void calcularProximoPiso(tascensor ascensor, int vec_pos[]);

	void procesarPeticion();

	void recibirPeticion();

	void log(std::string message);

	void sync(std::string message);

	void debug(std::string message);

public:
	ControladorCentral(int cantidadAscensores, int cantidadPisos, int capacidad,
			int velocidad, bool modoDebug, bool modoLog, bool modoSyn,
			bool modoCout);

	virtual ~ControladorCentral();

	void start();
};

#endif /* CONTROLADORCENTRAL_H_ */
